//
//  QGComposeViewController.swift
//  斯威夫特微博
//
//  Created by youyoumacmini3 on 2017/8/2.
//  Copyright © 2017年 youyoumacmini3. All rights reserved.
//

import UIKit
import SVProgressHUD
/// 撰写微博控制器
/*
 加载视图控制器的时候，如果 XIB 和 控制器同名，默认的构造函数会优先加载 XIB
 */
class QGComposeViewController: UIViewController {

    
    /// 标题标签 - 换行热键：option + 回车
    //  逐行选中文本并且设置属性
    //  如果想要调整上下两行间距，可以增加一空行，设置空行的字体大小
    @IBOutlet var titleLabel: UILabel!
    /// 发布按钮
    @IBOutlet var sendButton: UIButton!
    /// 文本编辑视图
    @IBOutlet weak var textView: QGComposeTextView!
    /// 工具栏
    @IBOutlet weak var toolBar: UIToolbar!
    
    /// 工具栏底部约束
    @IBOutlet weak var toolbarBottomCons: NSLayoutConstraint!
    
    lazy var emotionView: CZEmotionInputView = CZEmotionInputView.inputView { [weak self] (emotion) in

        self?.textView.insertEmotion(em: emotion)
    }

    
    //MARK: - 视图生命周期
    override func viewDidLoad() {
        super.viewDidLoad()

        // 强行更新约束
        //view.layoutIfNeeded()
        
        
        setUI()
        
        // 监听键盘通知 - name:后不知道怎么填。利用Xcode自动转换工具，可以基本不用改什么代码，就能移植到最新的swift语法项目中
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardChanged),
                                               name: NSNotification.Name.UIKeyboardWillChangeFrame,
                                               object: nil)
    
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        // 关闭键盘
        textView.resignFirstResponder()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        // 激活键盘
        textView.becomeFirstResponder()
    }
    
    //MARK: - 键盘监听方法
    @objc private func keyboardChanged(n: NSNotification) {
        
        //print(n.userInfo)
        
        // 1. 目标 rect
        guard let rect = (n.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
              let duration = (n.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue
            else { return }
        
        // 2. 设置底部约束高度
        let offSet = view.bounds.height - rect.origin.y
        
        // 3. 更新底部约束
        toolbarBottomCons.constant = offSet
        
        // 4. 动画更新约束
        UIView.animate(withDuration: duration) { 
            self.view.layoutIfNeeded()
        }
        
    }
    
    
    @objc fileprivate func close() {
        dismiss(animated: true, completion: nil)
    }
    
    @IBAction func postStatus() {
        print("发布微博")
        
        // 1. 获取微博文字
        let text = textView.emotionText
        
        let image = UIImage(named: "")
        
        // 2. 发布微博
        // FIXME: - 测试发布带图片微博
        QGNetworkManager.shared.postStatus(text: text, image: image) { (result, isSuccess) in
            // 发布微博等接口已经被废弃了 所以 假装能用吧
            
            // 修改指示器样式
            SVProgressHUD.setDefaultStyle(.dark)
            
            let message = isSuccess ? "发布成功" : "发布假成功"
            
            SVProgressHUD.showInfo(withStatus: message)
            
            // 如果成功，延迟一段时间关闭当前窗口
           // if isSuccess {
              DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: { 
                // 恢复样式
                SVProgressHUD.setDefaultStyle(.light)
                self.close()
                
              })
           // }
        }
        
    }
   

    // 切换表情键盘
    @objc fileprivate func emoticonKeyboard() {
        // textView.inputView 就是文本矿的输入视图
        // 如果使用系统默认的键盘，输入视图为 nil
        
        // 1. 测试键盘视图 - 视图宽度可以随便设置，因为就是屏幕宽度
//        let keyboardView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 200))
//        keyboardView.backgroundColor = #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
        
        // 2. 设置键盘视图
        textView.inputView = (textView.inputView == nil) ? emotionView : nil
        
        // 3. 切换键盘 必须 刷新键盘视图
        textView.reloadInputViews()
        
    }
    
    
//    lazy var sendButton: UIButton = {
//        
//        let btn = UIButton()
//        btn.setTitle("发布", for: [])
//        btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
//        // 设置标题颜色
//        btn.setTitleColor(UIColor.white, for: [])
//        btn.setTitleColor(UIColor.darkGray, for: .disabled)
//        
//        // 设置背景图片
//        btn.setBackgroundImage(UIImage(named: "common_button_orange"), for: [])
//        btn.setBackgroundImage(UIImage(named: "common_button_orange_highlighted"), for: .highlighted)
//        btn.setBackgroundImage(UIImage(named: "common_button_white_disable"), for: .disabled)
//        
//        // 设置大小
//        btn.frame = CGRect(x: 0, y: 0, width: 45, height: 35)
//        
//        
//        return btn
//    }()
}

// MARK: - UITextViewDelegate
/*
  通知： 一对多，只要有注册的监听者，在注销监听之前，都可以接收到通知
  代理： 一对一，最后设置的代理对象有效
 
 苹果日常开发中，代理的监听的方式是最多的
 
  - 代理是发生事件时，直接让代理执行协议方法（效率更高）
    直接反向传值
  - 通知是发生事件时，将通知发送给通知中心，通知中心再‘广播’通知（效率相对较低）
    如果层次嵌套非常深，可以使用通知传值
*/

extension QGComposeViewController : UITextViewDelegate {
    
    // 文本视图文字变化
    func textViewDidChange(_ textView: UITextView) {
        sendButton.isEnabled = textView.hasText
    }
    
}

private extension QGComposeViewController {
    func setUI() {
        
        view.backgroundColor = UIColor.white
        setNavigationBar()
        setToolBar()
    }
    
    
    /// 设置工具栏
    func setToolBar() {
        
        let itemSettings = [["imageName": "compose_toolbar_picture"],
                            ["imageName": "compose_mentionbutton_background"],
                            ["imageName": "compose_trendbutton_background"],
                            ["imageName": "compose_emoticonbutton_background", "actionName": "emoticonKeyboard"],
                            ["imageName": "compose_add_background"]]
        // 遍历数组
        var items = [UIBarButtonItem]()
        
        for s in itemSettings {
            
            guard let imageName = s["imageName"] else {
                continue
            }
            let image = UIImage(named: imageName)
            let imageHighted = UIImage(named: imageName + "_highlighted")

            let btn = UIButton()
            btn.setImage(image, for: [])
            btn.setImage(imageHighted, for: .highlighted)
            
            btn.sizeToFit()
            
            if let actionName = s["actionName"] {
                 // 给按钮添加监听方法
                btn.addTarget(self, action: Selector(actionName), for: .touchUpInside)
            }
            
            
            // 追加按钮
            items.append(UIBarButtonItem(customView: btn))
            
            // 追加弹簧(每个按钮之间间距自动撑开)
            items.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
            
        }
        // 删除末尾弹簧
        items.removeLast()
        
        toolBar.items = items
        
    }
    
    /// 设置导航栏
    func setNavigationBar() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", fontSize: 17, target: self, action: #selector(close))
        
        // 设置发送按钮
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: sendButton)
        
        // 设置标题视图
        navigationItem.titleView = titleLabel
        
        
        sendButton.isEnabled = false
    }
}


